// 1. Dart 的继承是单继承，一个字类只能有一个父类
// 2. 子类只会继承父类里面可见的属性和方法，不会继承私有属性和方法
// 3. 子类只会继承父类默认的构造函数，不会继承其他构造函数
// 4. 子类可以重写父类的方法，也可以使用 super 调用父类方法

void main() {
  // 创建猫
  Cat cat = Cat('Tom');
  print(cat.name);

  cat.eat();
  cat.walk();

  // 创建鱼
  Fish fish = Fish('Nemo');
  print(fish.name);

  fish.eat();
  fish.swim();
}

class Cat extends Animal {
  // 子类定义自己的构造函数，并使用 super 调用父类的构造函数传递数据
  Cat(String name) : super(name);

  // 重写父类的方法
  @override
  void eat() {
    // 执行自己的逻辑
    print('重写父类的 eat 方法');
    // 调用父类的方法
    super.eat();
  }

  void walk() {
    print('walk');
  }
}

class Fish extends Animal {
  Fish(String name) : super(name);
  void swim() {
    print('swim');
  }
}

// 定义父类，父类里面有其他类都要的属性和方法
// 使用继承，让子类继承父类，子类就可以使用父类的属性和方法
class Animal {
  String? name;

  // 自定义类名构造函数
  // 如果父类自定义构造函数，那么子类就继承不到，子类就需要自己定义构造函数
  Animal(this.name);

  void eat() {
    print('eat');
  }
}
